package com.nexgo.payment.api;

import android.content.Context;
import android.text.TextUtils;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.AMapLocationQualityReport;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Locale;

/**
 * 获取百度定位数据 //切换成高德定位
 *
 * @author 谭忠扬-YuriTam
 * @time 2017年05月15日
 */
public class ApiLocationService {
    private final Logger mLog = LoggerFactory.getLogger(ApiLocationService.class.getSimpleName());

    private Context mContext;
    private LocationInterface mLocationInterface;
    private AMapLocationClient mLocationClient;
    private SimpleDateFormat sdf = null;
    private boolean mIsFirstTime = false;

    public ApiLocationService(Context context, LocationInterface mLocationInterface){
        this.mContext = context;
        this.mLocationInterface = mLocationInterface;
    }

    /**
     * 初始化定位参数定位
     */
    private void InitLocation(){
        //初始化client
        if (mLocationClient == null){
            mLocationClient = new AMapLocationClient(mContext);
        }
        //设置定位参数
        AMapLocationClientOption option = new AMapLocationClientOption();
        option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选，设置定位模式，可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        option.setGpsFirst(false);//可选，设置是否gps优先，只在高精度模式下有效。默认关闭
        option.setHttpTimeOut(30000);//可选，设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        option.setInterval(2000);//可选，设置定位间隔。默认为2秒
        option.setNeedAddress(true);//可选，设置是否返回逆地理地址信息。默认是true
        option.setOnceLocation(true);//可选，设置是否单次定位。默认是false
        option.setOnceLocationLatest(true);//可选，设置是否等待wifi刷新，默认为false.如果设置为true,会自动变为单次定位，持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选， 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        option.setSensorEnable(false);//可选，设置是否使用传感器。默认是false
        option.setWifiScan(true); //可选，设置是否开启wifi扫描。默认为true，如果设置为false会同时停止主动刷新，停止以后完全依赖于系统刷新，定位位置可能存在误差
        option.setLocationCacheEnable(true); //可选，设置是否使用缓存定位，默认为true
        // 设置定位参数
        mLocationClient.setLocationOption(option);
        // 设置定位监听
        mLocationClient.setLocationListener(new MyLocationListener());
    }

    /**
     * 初始化定位客户端
     */
    public void startLocation() {
        //开启定位
        InitLocation();
        // 启动定位
        mIsFirstTime = true;
        mLocationClient.startLocation();
    }

    /**
     * 停止定位服务
     */
    public void stopLocation() {
        if (mLocationClient != null && mLocationClient.isStarted()){
            mLocationClient.stopLocation();
        }
    }

    /**
     * 销毁定位
     */
    public void destroyLocation(){
        if (mLocationClient != null){
            mLocationClient.onDestroy();
        }
    }

    /**
     * 定位回调
     */
    private class MyLocationListener implements AMapLocationListener {
        @Override
        public void onLocationChanged(AMapLocation location) {
            if (!mIsFirstTime) return;
            mIsFirstTime = false;
            if (null != location) {
                StringBuffer sb = new StringBuffer();
                //errCode等于0代表定位成功，其他的为定位失败，具体的可以参照官网定位错误码说明
                if(location.getErrorCode() == 0){
                    sb.append("定位成功" + "\n");
                    sb.append("定 位 类 型 : " + location.getLocationType() + "\n");
                    sb.append("经    度    : " + location.getLongitude() + "\n");
                    sb.append("纬    度    : " + location.getLatitude() + "\n");
                    sb.append("精    度    : " + location.getAccuracy() + "米" + "\n");
                    sb.append("提 供 者    : " + location.getProvider() + "\n");
                    sb.append("速    度    : " + location.getSpeed() + "米/秒" + "\n");
                    sb.append("角    度    : " + location.getBearing() + "\n");
                    // 获取当前提供定位服务的卫星个数
                    sb.append("卫 星 数    : " + location.getSatellites() + "\n");
                    sb.append("国    家    : " + location.getCountry() + "\n");
                    sb.append("省    份    : " + location.getProvince() + "\n");
                    sb.append("城    市    : " + location.getCity() + "\n");
                    sb.append("城 市 编 码 : " + location.getCityCode() + "\n");
                    sb.append("区    域    : " + location.getDistrict() + "\n");
                    sb.append("区 域 码    : " + location.getAdCode() + "\n");
                    sb.append("地    址    : " + location.getAddress() + "\n");
                    sb.append("兴 趣 点    : " + location.getPoiName() + "\n");
                    //定位完成的时间
                    sb.append("定 位 时 间 : " + formatUTC(location.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n");
                } else {
                    //定位失败
                    sb.append("定位失败" + "\n");
                    sb.append("错 误 码    :" + location.getErrorCode() + "\n");
                    sb.append("错 误 信 息 :" + location.getErrorInfo() + "\n");
                    sb.append("错 误 描 述 :" + location.getLocationDetail() + "\n");
                }
                sb.append("******************* 定位质量报告 *******************").append("\n");
                sb.append("* WIFI 开 关   ：").append(location.getLocationQualityReport().isWifiAble() ? "开启":"关闭").append("\n");
                sb.append("* GPS 状 态    ：").append(getGPSStatusString(location.getLocationQualityReport().getGPSStatus())).append("\n");
                sb.append("* GPS 卫 星 数 ：").append(location.getLocationQualityReport().getGPSSatellites()).append("\n");
                sb.append("****************************************************");
                mLog.debug(sb.toString());
                stopLocation();
                if (mLocationInterface != null){
                    mLocationInterface.onLocation(location);
                }
            } else {
                if (mLocationInterface != null){
                    mLocationInterface.onLocation(null);
                }
            }
        }
    }

    /**
     * 获取GPS状态的字符串
     *
     * @param statusCode GPS状态码
     * @return
     */
    private String getGPSStatusString(int statusCode){
        String str = "";
        switch (statusCode){
            case AMapLocationQualityReport.GPS_STATUS_OK:
                str = "GPS状态正常";
                break;
            case AMapLocationQualityReport.GPS_STATUS_NOGPSPROVIDER:
                str = "手机中没有GPS Provider，无法进行GPS定位";
                break;
            case AMapLocationQualityReport.GPS_STATUS_OFF:
                str = "GPS关闭，建议开启GPS，提高定位质量";
                break;
            case AMapLocationQualityReport.GPS_STATUS_MODE_SAVING:
                str = "选择的定位模式中不包含GPS定位，建议选择包含GPS定位的模式，提高定位质量";
                break;
            case AMapLocationQualityReport.GPS_STATUS_NOGPSPERMISSION:
                str = "没有GPS定位权限，建议开启gps定位权限";
                break;
            default:
                break;
        }
        return str;
    }

    /**
     * 格式化定位时间
     *
     * @param millis
     * @param strPattern
     * @return
     */
    private String formatUTC(long millis, String strPattern) {
        if (TextUtils.isEmpty(strPattern)) {
            strPattern = "yyyy-MM-dd HH:mm:ss";
        }
        if (sdf == null) {
            try {
                sdf = new SimpleDateFormat(strPattern, Locale.CHINA);
            } catch (Throwable e) {
            }
        } else {
            sdf.applyPattern(strPattern);
        }
        return sdf == null ? "NULL" : sdf.format(millis);
    }

    public interface LocationInterface {
        void onLocation(AMapLocation location);
    }
}
